package com.situ.mall.common.util;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.situ.mall.common.exception.MyException;
import org.apache.commons.lang3.ObjectUtils;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Random;

//操作字符串的工具类
public class StringUtil {

    //md5加密
    public static String md5(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes("UTF-8"));
            return new BigInteger(1, md.digest()).toString(16);
        } catch (NoSuchAlgorithmException | UnsupportedEncodingException ignored) {
        }
        return null;
    }

    //判断object非空且非空字符串
    public static Boolean isObjectNotEmpty(Object obj) {
        String str = ObjectUtils.toString(obj, "");
        return StringUtils.isNotBlank(str);
    }

    //判断字符串是null 或是空字符串
    public static boolean isBlank(String s) {
        return s == null || s.isEmpty();
    }

    //判断字符串既不是null 也不是空字符串
    public static boolean isNotBlank(String s) {
        return s != null && !s.isEmpty();
    }

    // 接收一个字符串，返回这个串的驼峰命名方式的结果
    public static String change(String s) {
        if (s == null) {
            return null;
        }
        if (!s.contains("_")) {// s中不包含下划线
            return s;
        }
        // work_no [work no]
        String[] arr = s.split("_");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            if (i == 0) {
                sb.append(arr[i]);
            } else {
                sb.append(arr[i].substring(0, 1).toUpperCase());
                //arr[i]首字母大写之后再拼
                sb.append(arr[i].substring(1).toLowerCase());
            }
        }
        return sb.toString();// worko
    }

    // string转化为LocalDateTime
    public static LocalDateTime localDateTime(String time) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return LocalDateTime.parse(time, formatter);
    }

    // string转化为LocalDate
    public static LocalDate localDate(String time) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return LocalDate.parse(time, formatter);
    }


    // 生成一个由数字和字母组合的n位字符串
    public static String getString(int length) {
        StringBuilder val = new StringBuilder();
        Random random = new Random();

        //循环次数等于指定的长度，每次循环给字符串塞一个字符
        for (int i = 0; i < length; i++) {
            //随机指定输出字母还是数字
            String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
            // 输出字符
            if ("char".equalsIgnoreCase(charOrNum)) {
                // 取得大写字母还是小写字母
                int choice = random.nextInt(2) % 2 == 0 ? 65 : 97;
                //如果是字母就拼两个
                val.append((char) (choice + random.nextInt(26)));
                val.append((char) (choice + random.nextInt(26)));
            // 输出数字
            } else {
                val.append(random.nextInt(10));
            }
        }

        return val.toString();
    }

    // 验证手机号格式
    public static void checkTel(String tel) {
        //查电话号码长度是不是11位
        if (tel.length() != 11) {
            throw new MyException("电话号码有误！");
        }
        //查电话号码是不是0-9纯数字
        for (int i = 0; i < 11; i++) {
            char c = tel.charAt(i);
            if (c < '0' || c > '9') {
                throw new MyException("电话号码有误！");
            }
        }
    }

    //验证身份证号格式（需修改）
    public static void checkIdCardNumber(String idCardNumber) {
        //查电话号码长度是不是18位
        if (idCardNumber.length() != 18) {
            throw new MyException("身份证号有误！");
        }
        //查电话号码是不是0-9纯数字
        for (int i = 0; i < 18; i++) {
            char c = idCardNumber.charAt(i);
            if (c < '0' || c > '9') {
                throw new MyException("身份证号有误！");
            }
        }
    }
}
